//
//  ABHomeViewController.swift
//  microblog
//
//  Created by 安波 on 15/10/26.
//  Copyright © 2015年 anbo. All rights reserved.
//

import UIKit
import AFNetworking
import SVProgressHUD

/// 定义枚举，统一管理cell的ID
enum ABStatusCellIdentifier: String {
    case NormalCell = "NormalCell"
    case ForwardCell = "ForwardCell"
}

class ABHomeViewController: ABBaseTableViewController {
    
    // MARK: - 属性
    /// 微博模型数组
    private var statuses: [ABStatus]? {
        didSet{
            tableView.reloadData()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // 设置导航栏
        setupNavigationBar()
        // 设置tableView的属性  注意：在准备注册时，越早越好，否则有可能还没有来得及注册就开始去缓存中查找，导致程序崩溃
        prepareTableView()
        
        // 添加下拉刷新子控件
        refreshControl = ABRefreshControl()
        refreshControl?.tintColor = UIColor.clearColor()
        
        // 添加下拉刷新响应事件
        refreshControl?.addTarget(self, action: "loadData", forControlEvents: UIControlEvents.ValueChanged)
        
        // 调用beginRefreshing开始刷新
        refreshControl?.beginRefreshing()
//        loadData()
        // 代码触发事件 refreshControl 的 ValueChanged
        refreshControl?.sendActionsForControlEvents(UIControlEvents.ValueChanged)
 
        // 判断登陆才切换
        if !ABUserAccount.userLogin(){
            return
        }
        
    }
    
    // MARK: - tableView 属性设置
    /// tableView的属性设置
    private func prepareTableView(){
        // 将上拉加载更多的菊花 添加到footView上
        tableView.tableFooterView = pullUpView
        
        // tableView注册cell
        tableView.registerClass(ABStatusNormalCell.self, forCellReuseIdentifier: ABStatusCellIdentifier.NormalCell.rawValue)
        tableView.registerClass(ABStatusForwardCell.self, forCellReuseIdentifier: ABStatusCellIdentifier.ForwardCell.rawValue)
        
        // 去掉分隔线
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        
        //设置预估行高
        tableView.estimatedRowHeight = 200
        
        // 根据约束自己来设置高度
//        tableView.rowHeight = UITableViewAutomaticDimension
//        tableView.rowHeight = 500
        
    }
    
    /// 设置导航栏
    private func setupNavigationBar() {
        
        // 创建左右两个Item
        navigationItem.leftBarButtonItem = UIBarButtonItem(imageName: "navigationbar_friendsearch")
        navigationItem.rightBarButtonItem = UIBarButtonItem(imageName: "navigationbar_pop")
        
        // 创建中间的 title
        // 获得名字
        let name = ABUserAccount.loadAccount()?.name ?? "没有名字"
        // 创建一个按钮
        let titleButton = ABHomeTitleButton()
        // 设置按钮的属性
        titleButton.setImage(UIImage(named: "navigationbar_arrow_down"), forState: UIControlState.Normal)
        titleButton.setTitle(name, forState: UIControlState.Normal)
        titleButton.setTitleColor(UIColor.blackColor(), forState: UIControlState.Normal)
        titleButton.sizeToFit()
        // 监听 点击事件
        titleButton.addTarget(self, action: "titleButtonClick:", forControlEvents: UIControlEvents.TouchUpInside)
        
        // 添加到titleView上
        navigationItem.titleView = titleButton
    }
    
    // MARK: - 响应事件
    // TODO: rafreshControl 响应事件
    func loadData(){
//        print("加载微博数据")
        
        // 默认下拉刷新，获取id最大的微博，如果没有数据，就默认加载20条数据
        var since_id = statuses?.first?.id ?? 0
        var max_id = 0
        
        // 判断  如果菊花正在转，表示 上拉加载更多数据
        if pullUpView.isAnimating() {
            // 上拉加载更多数据
            since_id = 0
            // 设置为最后一条微博的id
            max_id = statuses?.last?.id ?? 0
        }
        
        // 加载微博数据
        ABStatus.loadStatus(since_id, max_id: max_id) { (statuses, error) -> () in
            
            // TODO: 特别注意：在加载微博数据后，记得要将下拉刷新关闭
            self.refreshControl?.endRefreshing()
            
            // TODO: 特别注意：在加载更多数据后，记得要将加载更多刷新关闭
            self.pullUpView.stopAnimating()
            
            // 判断有错误
            if error != nil {
                SVProgressHUD.showErrorWithStatus("加载数据失败，网络不给力", maskType: SVProgressHUDMaskType.Black)
                return
            }
            
            // 下拉刷新，显示加载了多少条微博数据
            if since_id > 0 {
                let count = statuses?.count ?? 0
                // TODO: 显示下拉刷新加载了多少条微博数据
                self.showTipView(count)
            }
            
            // 没有错误,判断模型数组是否为空
            if statuses == nil || statuses?.count == 0 {
                SVProgressHUD.showErrorWithStatus("没有新的微博数据", maskType: SVProgressHUDMaskType.Black)
                return
            }
            
            // 判断如果是下拉刷新，将获取到的数据拼接到现有数据的前面
            if since_id > 0 {  // 下拉刷新
                // 最新数据 = 新获取到的数据 + 原有的数据
//                print("下拉刷新,获取到: \(statuses?.count)")
                self.statuses = statuses! + self.statuses!
            }else if max_id > 0 { // 上拉加载更多
                // 最新数据 = 原有的数据 + 新获取到的数据
//                print("下拉刷新,获取到: \(statuses?.count)")
                self.statuses = self.statuses! + statuses!
            }else{
                // 有新的微博数据,直接赋值
                self.statuses = statuses
                
//                print("获取最新20条数据，获取到 \(statuses?.count)  条微博")
            }
            
        }
        
    }
    
    
    /// 显示下拉刷新加载了多少条微博
    private func showTipView(count: Int) {
        // 设置刷新显示控件的高度
        let tipLabelHeight: CGFloat = 44
        // 创建一个label来显示刷新记录
        let tipLabel = UILabel()
        // 设置frame   初始状态的位置
        tipLabel.frame = CGRect(x: 0, y: -20 - tipLabelHeight, width: UIScreen.width(), height: tipLabelHeight)
        
        tipLabel.textColor = UIColor.whiteColor()
        tipLabel.backgroundColor = UIColor.orangeColor()
        tipLabel.font = UIFont.systemFontOfSize(14)
        tipLabel.textAlignment = NSTextAlignment.Center
        
        tipLabel.text = count == 0 ? "没有新的微博" : "加载了 \(count) 条微博"
        
        // 导航栏是从状态栏下面开始的，插入到导航栏最下面
        navigationController?.navigationBar.insertSubview(tipLabel, atIndex: 0)
        
        // 设置动画持续时间
        let duration = 0.75
        // 开始动画
        UIView.animateWithDuration(duration, animations: { () -> Void in
            
            // 改变tipLabel显示frame的y值
            tipLabel.frame.origin.y = tipLabelHeight
            
            }) { (_) -> Void in
                
                // 回调时  动画效果
                UIView.animateKeyframesWithDuration(duration, delay: 0.3, options: UIViewKeyframeAnimationOptions(rawValue: 0), animations: { () -> Void in
                    
                    // 修改tipLabel显示frame值为初始位置
                    tipLabel.frame.origin.y = -20 - tipLabelHeight
                    
                    }, completion: { (_) -> Void in
                        //移除
                        tipLabel.removeFromSuperview()
                })
                
        }
        
    }

    // TODO: titleButton 的点击事件
    /// titleButton 的点击事件
    func titleButtonClick(button: UIButton){
        print(__FUNCTION__)
        
        // 设置按钮的选中状态
        button.selected = !button.selected

        //  按钮的imageView旋转
        imageViewRotation(button)
        
    }
    
    // MARK: - 动画效果
    // TODO: titleView按钮的imageView旋转动画
    /// 按钮的imageView旋转动画
    func imageViewRotation(button: UIButton){
        // 定义它的动画属性
        var transform: CGAffineTransform?
        // 根据按钮的选择情况 实现动画
        if button.selected {
            transform = CGAffineTransformMakeRotation(CGFloat(M_PI - 0.01))
        }else{
            transform = CGAffineTransformIdentity
        }
        // 转动动画
        UIView.animateWithDuration(0.25) { () -> Void in
            button.imageView?.transform = transform!
        }
    }
    
    
    // MARK: - tableView 代理和数据源方法
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return statuses?.count ?? 0
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        // 获取模型
        let status = statuses![indexPath.row]
        
        // 获取cell
        let cell = tableView.dequeueReusableCellWithIdentifier(status.cellID()) as! ABStatusCell
        
        // 设置cell的模型
        cell.status = status
        
        // 当最后一个cell显示的时候，来加载更多微博数据.如果菊花正在显示，就表示正在加载数据，就不加载数据
        if indexPath.row == statuses!.count - 1 && !pullUpView.isAnimating() {
            // 菊花转起来
            pullUpView.startAnimating()
            // 上拉加载更多数据
            loadData()
            
        }
        
        return cell
        
    }
    // 返回cell的高度，如果每次都计算行高，消耗性能，缓存行高
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        // 获取模型
        let status = statuses![indexPath.row]
        
        // 去 模型 里面查看之前有没有缓存行高（故需要在模型里有一个属性来记录行高的缓存情况）
        if let rowHeight = status.rowHeight {
            // 模型中有缓存行高 直接取用
//            print("返回cell: \(indexPath.row),缓存行高: \(rowHeight)")
            return rowHeight
        }
        
        // 获取cell
        let cell = tableView.dequeueReusableCellWithIdentifier(status.cellID()) as! ABStatusCell
        
        // 调用cell计算行高的方法
        let rowHeight = cell.rowHeight(status)
//        print("获取:\(indexPath.row),cell高度: \(rowHeight)")
        
        // 将行高缓存起来
        status.rowHeight = rowHeight
        
        return rowHeight
    }
    
    // MARK: - 懒加载
    /// 上拉加载更多数据显示的菊花
    private lazy var pullUpView: UIActivityIndicatorView = {
       
        // 创建一个菊花
        let indicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge)
    
        // 设置菊花显示的颜色
        indicator.color = UIColor.magentaColor()
        
        // 返回菊花
        return indicator
    }()
    
}



